<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use think\facade\Route;

//全局变量设置
//Route::pattern([
//   'id'=>'\d+',
//   'uid'=>'\d+'
//]);

//闭包
Route::get('think', function () {
    return 'hello,ThinkPHP6 and GHJ!';
});
Route::get('think1/:name', function ($name) {
    return 'hello,ThinkPHP6 and GHJ!'.$name;
});

//Route::get('hello/:name', 'Index/hello');

//如果我们需要对具体的变量进行单独的规则设置，则需要通过pattern()方法   ['id'=>'\d+'] 表示id只能写数字
Route::rule('ds/:id','Address/details','GET|POST')->pattern(['id'=>'\d+']);
Route::rule('sc/:id/:uid','Address/search','GET|POST')
       ->pattern([
           'id'=>'\d+',
           'uid'=>'\d+'
       ]);

Route::rule('ds-:id','Address/details');

//路由动态组合拼装  地址和参数如果都是模糊动态的，可以使用如下方法
Route::rule('hi-:name-:id','Hello:name/index')->pattern(['id'=>'\d+']);

Route::rule('gb','group.blog/index');

//对于地址，还有一种完整路径的方式去执行操作方法：完整类名@操作方法
//另一种静态方式：完整路径支持这种方法的路由地址：完整类名::静态方法
Route::rule('ds~:id','app\controller\Address@details')->ext('html');

//路由可以通过 ::redirect() 方法实现重定向跳转 ，第三参数为状态码
Route::redirect('ds*:id','https://web.fosu.edu.cn','302');

//ext()方法的作用是检测URL后缀，比如强制所有URL后缀为.html
//https() 方法作用是检测是否为https请求，结合ext强制html如下
//Route::rule('ds/:id','Address/details','GET|POST')->pattern(['id'=>'\d+'])->ext('html')->https();
//denyExt() 表示禁止使用某种后缀


//使用domain()方法作用是检测当前的域名是否匹配，完整域名和子域名都可以
Route::rule('ds_:id','Address/details')->domain('www.ghj.com');

//ajax/pjax/json 方法作用是检测当前的页面是否是以上请求方式
//Route::rule('ds%:id','Address/details')->option([
//    'ajax'=>true
//]);

//filter方法作用是对额外参数进行检测，额外参数可以表单提交
//Route::rule('ds`:id','Address/details')->option([
//    'filter'=>['id'=>1,'type'=>2]
//]);


//append() 方法作用是追加额外参数，这个额外参数并不需要通过URL传递
Route::rule('details/:id','address/details')->append(['status'=>10  ]);

//如果你想统一配置多个参数，方便管理，可以使用option方法数组配置
Route::rule('ds/:id')->option([
    'ext'=>'html',
    'https'=>true
]);

//如果想限定在 www.ghj.com 这个域名下才有效，通过域名路由闭包的形式  可可以设置完整域名
Route::domain('www',function(){
    Route::rule('details/:id','Address/details');
});
//支持多个二级（子）域名开头部分，使用相同的路由规则
Route::domain(['new','blog','www'],function(){
    Route::rule('details/:id','Address/details')->ext('html');
});

//跨域请求
//当不同域名进行跨域请求的时候，由于浏览器的安全限制，会被拦截
//所以，为了解除这个限制，我们通过路由 allowCrossDomain()来实现  并设置只有某种域名才能跨域
Route::rule('dt/:id','Address/details')->allowCrossDomain(
    ['Access-Control-Allow-Origin'=>'http://www.ghj.com:8000']
);

//使用group()方法，进行分组路由的注册
//Route::group(function(){
//    Route::rule('at/:id','Address/aTest');
//    Route::rule('ct/:id/:uid','Address/cTest');
//});

//Route::group('address',function(){
//    Route::rule('at/:id','Address/aTest');
//    Route::rule('ct/:id/:uid','Address/cTest');
//});
Route::group('add$',function(){
    Route::rule(':id','aTest')->pattern(['id'=>'\d+']);
    Route::rule(':name','aTest1')->pattern(['name'=>'\w+']);
    //分组moss，可以在分组中使用miss方法，当不满足匹配规则时跳转到这里
    Route::miss('miss');
})->prefix('Address/');




//全局MISS路由  匹配不到响应规则是自动跳转  打开 就代表打开了 强制路由
//Route::miss('public/miss');



//资源路由
//资源路由注册成功后，会自动提供以下方法
//GET访问模式: index(blog) create(blog/create) read(blog/:id) edit(blog/:id/edit)
//POST访问模式: save(blog)
//PUT访问模式:  update(blog/:id)
//DELETE访问mos: delete(blog/:id)

//使用rest() 更改系统给予的默认方法  1 请求方式 2 地址 3操作  可以批量操作
Route::rest('create',['GET','/add','create']);
Route::resource('blog','Blog');
//默认参数采用id名称 如果想用别的 比如  blog_id 则
// only()方法限定系统提供的资源方法   except()方法排除系统提供的资源方法
//Route::resource('blog','Blog')->vars(['blog'=>'blog_id'])->only(['index']);

//嵌套资源路由
//http:127.0.0.1/blog/:blog_id/comment/:id/edit
Route::resource('blog.comment','Comment');


//URL生成  见url控制器
Route::rule('ur$','Url/index');
Route::rule('ur/:id$','Url/details')->name('u');

Route::rule('re/:id','Rely/get');


Route::get('bi/:id','Rely/bin')->cache(3600); //局部缓存

//路由验证测试
//Route::rule('vr/:id','Verify/route')->validate(\app\validate\User::class,'route');
//路由独立验证
Route::rule('vr/:id','Verify/sct')->validate(
    [
        'id'=>'number|between:1,10',
        'email'=>\think\validate\ValidateRule::isEmail(null,'邮箱格式不正确')
    ],null,[
        'id.number'=>'编号必须是数字'
    ],true
);


//中间件学习
//注册一个路由局部中间件
//可在config中间件配置中设置别名
//可以给中间件传递额外参数，通过中间件入口方法的第三哥参数接受
//中间件也支持分组路由 闭包
Route::rule('ar/:id','address/read')->middleware(['Auth',\app\middleware\Check::class],'ok');